/*头文件声明*/
#include <REGX52.H>
#include<INTRINS.H>
#include "Seg.h"
#include "Key.h"
#include "LED.h"

/*变量声明区*/
unsigned char Key_SlowDown;/*按键减速变量*/
unsigned char Key_Val,Key_DOWN,Key_UP,Key_Old;/*按键消抖变量*/
unsigned char Seg_SlowDown;/*数码管减速变量*/
unsigned char Seg_Disp[6]={10,10,10,10,10,10};/*数码管显示数组*/
unsigned char SegPoint_Disp[6]={0,0,0,0,0,0};/*数码管小数点显示数组*/
unsigned char Seg_Disp_Index;
int Time[4]={400,400,400,400};
unsigned int systic;
unsigned char Led=0xFE;
unsigned char tmp;/*用来更改Led的变量*/
bit LED_StartFlag;
unsigned char SegMOde_Select=1;//用于模式一和模式二之间的切换 1-设置界面 0-运行状态界面
unsigned char LED_Mode;//0-模式一，1-模式二 2-模式3 3-模式四
unsigned char LEDMode3[4]={0x7E,0xBD,0xDB,0xE7};
unsigned char LEDMode4[4]={0xE7,0xDB,0xBD,0x7E};
unsigned char Seg_Mode;//0-运行状态界面 1-流转时间设置界面 2-数据显示界面
int Time_Set[4];//时间模式设置数组
unsigned char Flash_Enable;
unsigned char Twink_Flag;//闪烁标志位
unsigned int Time_800ms;
unsigned char Led_ModeSet;
unsigned char Key_Flag;

/*按键处理区*/
void Key_Proc()
{
	/*按键减速*/
	if(Key_SlowDown)return;
	Key_SlowDown=1;
	/*按键消抖*/
	Key_Val=Key_write();
	Key_DOWN=Key_Val&(Key_Val^Key_Old);
	Key_UP=~Key_Val&(Key_Val^Key_Old);
	Key_Old=Key_Val;

	/*按键长按有效*/
	if(LED_StartFlag==0)/*处于静止状态*/
{
		if(Key_Old==4)
		{
			Key_Flag=1;
		}
	else
	{
		Key_Flag=0;
	}	
}
	else
	{
	Key_Flag=0;
	}
	
	
	switch(Key_DOWN)
	{
		case 4:
		if(Seg_Mode==1)
	{
			if(Flash_Enable==1)
			{
				Led_ModeSet--;
				if(Led_ModeSet==255)Led_ModeSet=3;
			}
			
		if(Flash_Enable==2)
		{
			Time_Set[0]-=100;if(Time_Set[0]<0)Time_Set[0]=1200;
			Time_Set[1]-=100;if(Time_Set[1]<0)Time_Set[1]=1200;
			Time_Set[2]-=100;if(Time_Set[2]<0)Time_Set[2]=1200;
			Time_Set[3]-=100;if(Time_Set[3]<0)Time_Set[3]=1200;
		}
	}
		else if(Key_Flag==1&&Seg_Mode!=1)
		{
			Seg_Mode=2;
		}
		break;
		case 5:
		if(Seg_Mode==1)
	{
			if(Flash_Enable==1)
			{
				Led_ModeSet++;
				Led_ModeSet%=4;
			}
		if(Flash_Enable==2)
		{
			Time_Set[0]+=100;if(Time_Set[0]>1200)Time_Set[0]=0;
			Time_Set[1]+=100;if(Time_Set[1]>1200)Time_Set[1]=0;
			Time_Set[2]+=100;if(Time_Set[2]>1200)Time_Set[2]=0;
			Time_Set[3]+=100;if(Time_Set[3]>1200)Time_Set[3]=0;
		}
		
	}		
		break;
		case 7:
		LED_StartFlag^=1;
		break;
		case 6:
			if(LED_StartFlag==0)/*加限制条件使其在静止条件下才有效(此处可以优化)*/
			Flash_Enable++;
		/*将初始值给设置数组*/
		if((Flash_Enable==1&&LED_StartFlag==0)||(Flash_Enable==2&&LED_StartFlag==0))
		{
			Time_Set[0]=Time[0];
			Time_Set[1]=Time[1];
			Time_Set[2]=Time[2];
			Time_Set[3]=Time[3];
			Seg_Mode=1;	
		}
		if(Flash_Enable==1&&LED_StartFlag==0)
		Led_ModeSet=LED_Mode;
		if(Flash_Enable==3&&LED_StartFlag==0)
		{
			/*保存设置值*/
			LED_Mode=Led_ModeSet;
			Time[0]=Time_Set[0];
			Time[1]=Time_Set[1];
			Time[2]=Time_Set[2];
			Time[3]=Time_Set[3];	
			Seg_Mode=0;
			Flash_Enable=0;	
		}
			break;

	}

}

/*数据处理区*/
void Seg_Proc()
{
	unsigned char i=0;/*循环变量*/
	/*数码管减速*/
	if(Seg_SlowDown)return;/*如果为假直接返回*/
	Seg_SlowDown=1;

	switch(Seg_Mode)
	{
		/*运行状态界面*/
		case 0:
			if(Key_Flag==0)
	{
				Seg_Disp[0]=LED_StartFlag==1?11:12;/*三目操作符判断启动或暂停*/
		Seg_Disp[1]=LED_Mode+1;		
		if(Time[LED_Mode]/1000==0)
		Seg_Disp[2]=10;
		else
		{
		Seg_Disp[2]=Time[LED_Mode]/1000;
		}
		Seg_Disp[3]=Time[LED_Mode]/100%10;
		Seg_Disp[4]=Time[LED_Mode]/10%10;
		Seg_Disp[5]=Time[LED_Mode]%10;		
	}
		break;
	/*流转时间设置界面*/
		case 1:
		/*这里分别对应三种情况*/
		Seg_Disp[0]=14;
		if(Twink_Flag==1&&Flash_Enable==1)	
		Seg_Disp[1]=Led_ModeSet+1;
		else if(Twink_Flag==0&&Flash_Enable==1)
		Seg_Disp[1]=10;	/*此处还要学习高位熄灭*/
		else 
		{
			Seg_Disp[1]=Led_ModeSet+1;
		}			
		
		if(Twink_Flag==1&&Flash_Enable==2)	
	{
		if(Time_Set[LED_Mode]/1000==0)
		Seg_Disp[2]=10;
		else
		{
		Seg_Disp[2]=Time_Set[LED_Mode]/1000;
		}
		Seg_Disp[3]=Time_Set[LED_Mode]/100%10;
		Seg_Disp[4]=Time_Set[LED_Mode]/10%10;
		Seg_Disp[5]=Time_Set[LED_Mode]%10;	
	}
	else if(Twink_Flag==0&&Flash_Enable==2)
	{
	 Seg_Disp[2]=10;
	 Seg_Disp[3]=10;
	 Seg_Disp[4]=10;
	 Seg_Disp[5]=10;	
	}
		else 
		{
			if(Time_Set[LED_Mode]/1000==0)
			Seg_Disp[2]=10;
			else
			{
			Seg_Disp[2]=Time_Set[LED_Mode]/1000;
			}
		Seg_Disp[3]=Time_Set[LED_Mode]/100%10;
		Seg_Disp[4]=Time_Set[LED_Mode]/10%10;
		Seg_Disp[5]=Time_Set[LED_Mode]%10;	
		}
		
		break;
	
		case 2:
		Seg_Disp[0]=0;/*显示D*/
		Seg_Disp[1]=13;/*显示A*/
		Seg_Disp[2]=14;/*显示-*/
		Seg_Disp[3]=LED_Mode+1;/*显示运行模式*/
		/*显示一位和二位的小数点*/
		SegPoint_Disp[0]=1;
		SegPoint_Disp[1]=1;
		/*显示LED的显示位数*/
		if(LED_Mode==0||LED_Mode==1)
	{
		Seg_Disp[4]=0;
			/*暴力求解*/
		if(Led==0xFE)Seg_Disp[5]=1;
		if(Led==0xFD)Seg_Disp[5]=2;
		if(Led==0xFB)Seg_Disp[5]=3;
		if(Led==0xF7)Seg_Disp[5]=4;
		if(Led==0xEF)Seg_Disp[5]=5;
		if(Led==0xDF)Seg_Disp[5]=6;
		if(Led==0xBF)Seg_Disp[5]=7;
		if(Led==0x7F)Seg_Disp[5]=8;
	}
	
	if(LED_Mode==2||LED_Mode==3)
	{
			/*暴力求解*/
		if(Led==LEDMode3[0])
		{
			Seg_Disp[4]=1;
			Seg_Disp[5]=8;
		}
		
		if(Led==LEDMode3[1])
		{
			Seg_Disp[4]=2;
			Seg_Disp[5]=7;
		}
		
		if(Led==LEDMode3[2])
		{
			Seg_Disp[4]=3;
			Seg_Disp[5]=6;
		}
		
		if(Led==LEDMode3[3])
		{
			Seg_Disp[4]=4;
			Seg_Disp[5]=5;
		}
		
		if(Led==LEDMode4[0])
		{
			Seg_Disp[4]=4;
			Seg_Disp[5]=5;
		}
		
		if(Led==LEDMode4[1])
		{
			Seg_Disp[4]=3;
			Seg_Disp[5]=6;
		}
		
		if(Led==LEDMode4[2])
		{
			Seg_Disp[4]=2;
			Seg_Disp[5]=7;
		}
		
		if(Led==LEDMode4[3])
		{
			Seg_Disp[4]=1;
			Seg_Disp[5]=8;
		}
	}
		
		
		/*为避免与设置模式冲突此处应加上Seg_Mode!=1的限制条件*/
		if(Key_Flag==1&&Seg_Mode!=1)
		{
			Seg_Mode=0;
		}			

		break;
	}

}

/*其它函数显示区*/
void LED_Proc()
{
	static unsigned char i,j=0;
	P1=Led;
	if(systic==Time[LED_Mode])/*用变量加加来代替Delay*/
	{
		systic=0;
	switch(LED_Mode)
	{
		case 0:
		if(Led==0x7E)
	{
			j=0;
			Led=0xFE;
			Led=_crol_(Led,1);
			if(Led==0x7F)
		{
			LED_Mode=1;
			Led=0x7F;
		}
	}
		else
	{
		Led=_crol_(Led,1);
		if(Led==0x7F)
		{
			LED_Mode=1;
			Led=0x7F;
		}
	}
		break;
		case 1:
		Led=_cror_(Led,1);
		if(Led==0xFE)
		{
			LED_Mode=2;
			Led=0x7E;
		}
		break;
		case 2:	
			Led=LEDMode3[i];
			i++; i%=4;
		if(Led==0xE7)
			LED_Mode=3;
			break;
	
		case 3:
		Led=LEDMode4[j];	
		j++;
		if(j>3)LED_Mode=0;
		break;
	
	}
	
	
	
	
	}
		
	

	
	
	 

	



}

/*定时器初始化*/
void Timer0_Routine()
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}

/*中断服务函数*/
void Timer0_Serve() interrupt 1
{
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
if(++Key_SlowDown==10)Key_SlowDown=0;
if(++Seg_SlowDown==500)Seg_SlowDown=0;
	Seg_Serve(Seg_Disp_Index,Seg_Disp[Seg_Disp_Index],SegPoint_Disp[Seg_Disp_Index]);
	Seg_Disp_Index++;
	Seg_Disp_Index%=6;
	if(LED_StartFlag==1)
	systic++;
if(++Time_800ms==800)
{
	Twink_Flag^=1;
	Time_800ms=0;
}
}

int main()
{
Timer0_Routine();

while(1)
{
Key_Proc();
Seg_Proc();
LED_Proc();
}
}